package com.shengzai

/**
 * 在类的构造函数中，给定的参数为val常量，如果对于参数需要修改，那么在定义时，需要给定var修饰
 *
 * @param id
 * @param name
 * @param age
 * @param gender
 * @param clazz
 */
class Code17ClazzOp3(id: String, var name: String, age: Int, gender: String, clazz: String) {

  // 定义一个phoneNumber变量，不指定初始值，使用 _ 占位
  var phoneNumber: String = _

  def getName(): String = {
    name
  }

  def setName(inName: String): Unit = {
    this.name = inName
  }

  /**
   * override:表示重写父类中的toString函数
   *
   */
  override def toString: String = {
    s"${this.name},${this.age},${this.gender},${this.clazz},${this.id},${this.phoneNumber}"
  }

  /**
   * 重载构造函数
   */
  def this(id: String, name: String, age: Int, gender: String, clazz: String, phoneNumber_ : String) = {
    this(id, name, age, gender, clazz)
    this.phoneNumber = phoneNumber_
  }
}


// 当object修饰的内容和类的名称一样，那么当前object的类叫做clazz类的伴生对象
object Code17ClazzOp3 {

  def main(args: Array[String]): Unit = {
    val clazzOp = new Code17ClazzOp3("1001", "王五", 24, "男", "文科一班")
    println(clazzOp.name)
    clazzOp.setName("赵六")
    println(clazzOp.getName())

    val clazzOp1 = new Code17ClazzOp3("1001", "老六", 24, "男", "文科一班", "183****3834")
    println(clazzOp1)

    val clazzOp2: Code17ClazzOp3 = Code17ClazzOp3("1002", "李四", 24, "男", "文科一班", "183****3834")
    println(clazzOp2)
  }


  /**
   * 在 伴生对象中，如果添加了同名函数 apply，
   *    并且其返回值为当前类的对象，那么在 其他函数中创建类对象时，
   *        可以不使用 new 而直接能获取到其对象
   * @return
   */
  def apply(id: String, name: String, age: Int, gender: String, clazz: String, phoneNumber_ : String): Code17ClazzOp3 = {
    new Code17ClazzOp3(id, name, age, gender, clazz, phoneNumber_)
  }
}